/*************************************************************************
	> File Name: acquisition.h
	> Author: xuwenlong
	> Mail: myxuan475@126.com 
	> Created Time: 2018年01月17日 星期三 13时43分45秒
 ************************************************************************/

#ifndef __ACQUISITION_H__
#define __ACQUISITION_H__

#include <baseinfo/baseinfo.h>
#include <transport/transport.h>
#include <utils/timer.h>
#include <utils/shared_ptr.h>
#include <utils/sqlite.h>
#include <vector>
#include <queue>
#include "watchdog.h"
#include "acquisitor.h"
#include "template.h"
#include "channel.h"

class Acquisitor;
class Template;
class Channel;

typedef utils::SharedPtr<Acquisitor> tAcquisitor;
typedef utils::SharedPtr<Template> tTemplate;
typedef utils::SharedPtr<Channel> tChannel;

using namespace std;

class AcquisitionManager:public ModuleInterface,public TimerTask,public JsonRpcInterface
{
public:
    AcquisitionManager(int index);

    virtual ~AcquisitionManager();
    virtual void RunTimer();

    /*
     * inherid from ModuleInterface
     */
    virtual BOOL OnReceiveJson(
            S32 index,
            DAS_RESULT result,
            const string &method, const Json::Value &json);

    virtual void RegisterAcquisitor(int timeout);

    virtual DAS_RESULT connectServer(
            );
    virtual DAS_RESULT clearData();
    virtual DAS_RESULT startAcquire();
    virtual DAS_RESULT stopAcquire();

    virtual DAS_RESULT getDeviceStatus(
            const Json::Value &params,
            Json::Value &result);

    //温控状态
    virtual DAS_RESULT getTMCStatus(
            const Json::Value &params,
            Json::Value &result);
    //设置定时时间
    virtual DAS_RESULT setTMCTimer(
            const Json::Value &params);

    //设置开关控制
    virtual DAS_RESULT setTMCSwitch(
            const Json::Value &params);

    virtual DAS_RESULT setTMCTiming(
            const Json::Value &params);
    //设置档位
    virtual DAS_RESULT setTMCGearPos(
            const Json::Value &params);
    //设置工作模式
    virtual DAS_RESULT setTMCMode(
            const Json::Value &params);
    //设置锁定方式
    virtual DAS_RESULT setTMCLock(
            const Json::Value &params);

    virtual DAS_RESULT getIOStatus(
            const Json::Value &params,Json::Value &result);

    virtual DAS_RESULT setIOStatus(
            const Json::Value &params);

    DAS_RESULT GetAcquisitor(S32 id,tAcquisitor &acquisitor,tConnection &connector);

    //对某个设备执行操作
    DAS_RESULT indicateDevice(
            S32 id,const string &acqId,
            const OpValue &params);

    DAS_RESULT updateDeviceList(
            const Json::Value &params,
            Json::Value &result);

    DAS_RESULT updateTemplate(const Json::Value &params, Json::Value &result,bool lock = false);
    DAS_RESULT updateCommunication(const Json::Value &params, Json::Value &result,bool lock = false);
    DAS_RESULT updateDevices(const Json::Value &params, Json::Value &result,bool lock = false);

    DAS_RESULT debugDevice(
            const Json::Value &params,
            Json::Value &result);

    DAS_RESULT indicateDevice(
            const Json::Value &params,
            Json::Value &result);

    DAS_RESULT setDevice(
            const Json::Value &params,
            Json::Value &result);
    void modifyCycle(bool ret);
    DAS_RESULT dailyMemory(Json::Value &result);
private:
    Lock  m_ilock;
    BOOL                   m_bConnected;
    S32                    m_iIndex;

//    Lock  m_chnLock;

    S32                    m_iMaxCycle;

//    Lock                   m_iAcquisitorLock;
    Timer *                m_pTimer;

    int                    m_iTime;

    Lock                   m_quelock;
//    int                   m_bIsAcquisitor;//2: 暂停处理，0,：更新采集，1：正式采集
    queue<int>             m_events;

//    WatchDog   m_watchDog;
private:
    class AcqLock
    {
    public:
        AcqLock(ModuleInterface *_interface):
            interface(_interface) {
            if (interface)
                interface->stopAcquire();
        }

        ~AcqLock() {
            if (interface)
                interface->startAcquire();
        }

    private:
        ModuleInterface *interface;
    };

    MODULE_DECLARE(AcquisitionManager)
};

#endif//__ACQUISITION_H__
